<?php

declare(strict_types=1);

namespace App\CustHub\Model;

use App\CustHub\Policies\ModelPolicy;
use Hyperf\Database\Model\Builder;
use Hyperf\Database\Model\Relations\BelongsToMany;
use Hyperf\Database\Model\Relations\HasOne;
use Hyperf\Di\Annotation\Inject;
use Mine\MineModel;

/**
 * @property int $id 主键ID
 * @property int $uid 
 * @property int $main_uid 
 * @property int $robot_id 企微号ID
 * @property int $apply_source 申请来源
 * @property string $current_seq 当前序列号
 * @property int $item_flag 项目标志
 * @property int $gender 性别
 * @property string $real_name 真实姓名
 * @property string $remark 备注信息
 * @property string $nickname 昵称
 * @property string $alias 别名
 * @property string $call_name 称呼
 * @property string $internation_code 国际代码
 * @property int $create_time 创建时间（时间戳）
 * @property int $add_customer_time 添加客户时间（时间戳）
 * @property string $company_remark 公司备注
 * @property string $mobile 手机号
 * @property string $avatar 头像URL
 * @property string $corp_short_name 公司简称
 * @property string $corp_name 公司名称
 * @property string $group_id 分组ID
 * @property string $user_id 用户ID
 * @property array $mobile_list 手机号列表
 * @property string $position 职位
 * @property string $job 工作
 * @property int $corp_id 企业ID
 * @property string $corp_wxid 企业微信ID
 * @property int $create_seq 创建序列号
 * @property array $source_info 来源信息
 * @property int $source 来源：0=未知
 * @property string $desc 描述
 * @property int $status 状态
 * @property string $username 用户名
 * @property int $type 类型 0=企业联系人 1=外部联系人
 * @property int $robot_corp_id 机器人对应企业ID
 * @property string $friend_loss_time 好友流失时间
 * @property int $is_wechat 是否微信联系人：0=否 1=是
 * @property int $is_white 是否加入白名单：0=否 1=是
 * @property string $last_send_msg_time 最后发言时间
 * @property int $is_black 是否加入黑名单：0=否 1=是
 * @property string $external_userid 极速群发企业用户id
 * @property int $channel_code_id 
 * @property string $sync_batch_id 同步批次id
 * @property-read null|ChContactBlack $blackList 
 * @property-read null|ChContactWhite $whiteList 
 * @property-read null|\Hyperf\Database\Model\Collection|ChCorpTag[] $corpTags 
 * @property-read null|\Hyperf\Database\Model\Collection|ChSmartTag[] $smartTags 
 * @property-read null|ChRobot $robot 
 * @property-read null|\Hyperf\Database\Model\Collection|ChRoomMember[] $roomMember 
 * @property-read null|\Hyperf\Database\Model\Collection|ChContactMobile[] $mobileList 
 */
class ChContact extends MineModel
{
    #[Inject]
    protected ModelPolicy $modelPolicy;

    public bool $timestamps = false;
    /**
     * The table associated with the model.
     */
    protected ?string $table = 'ch_contact';

    /**
     * The attributes that are mass assignable.
     */
    protected array $fillable = ['id', 'uid', 'main_uid', 'robot_id', 'apply_source', 'current_seq', 'item_flag', 'gender', 'real_name', 'remark', 'nickname', 'alias', 'call_name', 'internation_code', 'create_time', 'add_customer_time', 'company_remark', 'mobile', 'avatar', 'corp_short_name', 'corp_name', 'group_id', 'user_id', 'mobile_list', 'position', 'job', 'corp_id', 'corp_wxid', 'create_seq', 'source_info', 'source', 'desc', 'status', 'username', 'type', 'robot_corp_id', 'friend_loss_time', 'is_wechat', 'is_white', 'last_send_msg_time', 'is_black', 'external_userid', 'channel_code_id', 'sync_batch_id'];

    /**
     * The attributes that should be cast to native types.
     */
    protected array $casts = ['id' => 'integer', 'uid' => 'integer', 'main_uid' => 'integer', 'robot_id' => 'integer', 'apply_source' => 'integer', 'item_flag' => 'integer', 'gender' => 'integer', 'create_time' => 'integer', 'add_customer_time' => 'integer', 'mobile_list' => 'array', 'corp_id' => 'integer', 'create_seq' => 'integer', 'source_info' => 'array', 'source' => 'integer', 'status' => 'integer', 'type' => 'integer', 'robot_corp_id' => 'integer', 'is_wechat' => 'integer', 'is_white' => 'integer', 'is_black' => 'integer', 'channel_code_id' => 'integer'];


    /**
     * 企业标签
     * @return BelongsToMany
     */
    public function corpTags(): BelongsToMany
    {
        return $this->belongsToMany(ChCorpTag::class, 'ch_contact_corp_tag', 'contact_id', 'corp_tag_id');
    }

    /**
     * 智能标签
     * @return BelongsToMany
     */
    public function smartTags(): BelongsToMany
    {
        return $this->belongsToMany(ChSmartTag::class, 'ch_contact_smart_tag', 'contact_id', 'smart_tag_id');
    }

    /**
     * 机器人
     * @return HasOne
     */
    public function robot(): HasOne
    {
        return $this->hasOne(ChRobot::class,'id','robot_id');
    }

    /**
     * 数据权限过滤
     * @param $query
     * @param int|null $uid
     * @return Builder
     */
    public function scopeWithPermission($query, ?int $uid = null): Builder
    {
        return $this->modelPolicy->apply($query, $this, $uid);
    }

    /**
     * 群成员
     * @return \Hyperf\Database\Model\Relations\HasMany
     */
    public function roomMember(): \Hyperf\Database\Model\Relations\HasMany
    {
        return $this->hasMany(ChRoomMember::class, 'user_id','user_id');
    }

    /**
     * 手机号
     * @return \Hyperf\Database\Model\Relations\HasMany
     */
    public function mobileList(): \Hyperf\Database\Model\Relations\HasMany
    {
        return $this->hasMany(ChContactMobile::class, 'contact_id','id');
    }

    public function blackList(): HasOne
    {
        return $this->hasOne(ChContactBlack::class,'user_id','user_id');
    }

    public function whiteList(): HasOne
    {
        return $this->hasOne(ChContactWhite::class,'user_id','user_id');
    }
}
